ZGlmZiAtLWdpdCBhL3NyYy9ndWlfbWFjLmMgYi9zcmMvZ3VpX21hYy5jCmluZGV4IDYxMTRkNzkuLjAwM2Y3YTcgMTAwNjQ0Ci0tLSBhL3NyYy9ndWlfbWFjLmMKKysrIGIvc3JjL2d1aV9tYWMuYwpAQCAtNCw3ICs0LDcgQEAKICAqCQkJCUdVSS9Nb3RpZiBzdXBwb3J0IGJ5IFJvYmVydCBXZWJiCiAgKgkJCQlNYWNpbnRvc2ggcG9ydCBieSBEYW55IFN0LUFtYW50CiAgKgkJCQkJICAgICAgYW5kIEF4ZWwgS2llbGhvcm4KLSAqCQkJCVBvcnQgdG8gTVBXIGJ5IEJlcm5oYXJkIFByn21tZXIKKyAqCQkJCVBvcnQgdG8gTVBXIGJ5IEJlcm5oYXJkIFBydWVtbWVyCiAgKgkJCQlJbml0aWFsIENhcmJvbiBwb3J0IGJ5IEFtbW9uIFNraWRtb3JlCiAgKgogICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCkBAIC0yNjAsNiArMjYwLDExIEBACiBPU0VyciBIYW5kbGVVbnVzZWRQYXJtcyhjb25zdCBBcHBsZUV2ZW50ICp0aGVBRXZlbnQpOwogI2VuZGlmCiAKKyNpZmRlZiBGRUFUX0dVSV9UQUJMSU5FCitzdGF0aWMgdm9pZCBpbml0aWFsaXNlX3RhYmxpbmUodm9pZCk7CitzdGF0aWMgV2luZG93UmVmIGRyYXdlciA9IE5VTEw7IC8vIFRPRE86IHB1dCBpbnRvIGd1aS5oCisjZW5kaWYKKwogLyoKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogQ29udmVyc2lvbiBVdGlsaXR5CkBAIC0yMzU3LDYgKzIzNjIsMTMgQEAKIAogICAgIHRoZVBhcnQgPSBGaW5kV2luZG93KHRoZUV2ZW50LT53aGVyZSwgJndoaWNoV2luZG93KTsKIAorI2lmZGVmIEZFQVRfR1VJX1RBQkxJTkUKKyAgICAvKiBwcmV2ZW50IHRoYXQgdGhlIHZpbSB3aW5kb3cgc2l6ZSBjaGFuZ2VzIGlmIGl0J3MgYWN0aXZhdGVkIGJ5IGEKKyAgICAgICBjbGljayBpbnRvIHRoZSB0YWIgcGFuZSAqLworICAgIGlmICh3aGljaFdpbmRvdyA9PSBkcmF3ZXIpCisgICAgICAgIHJldHVybjsKKyNlbmRpZgorCiAgICAgc3dpdGNoICh0aGVQYXJ0KQogICAgIHsKIAljYXNlIChpbkRlc2spOgpAQCAtMzA5Nyw2ICszMTA5LDEzIEBACiAjZW5kaWYKICovCiAKKyNpZmRlZiBGRUFUX0dVSV9UQUJMSU5FCisgICAgLyoKKyAgICAgKiBDcmVhdGUgdGhlIHRhYmxpbmUKKyAgICAgKi8KKyAgICBpbml0aWFsaXNlX3RhYmxpbmUoKTsKKyNlbmRpZgorCiAgICAgLyogVE9ETzogTG9hZCBiaXRtYXAgaWYgdXNpbmcgVE9PTEJBUiAqLwogICAgIHJldHVybiBPSzsKIH0KQEAgLTU4OTUsNyArNTkxNCw3IEBACiAgICAgdGhlQ1BCLmRpckluZm8uaW9GRGlySW5kZXggPSAwOwogICAgIHRoZUNQQi5kaXJJbmZvLmlvTmFtZVB0ciAgID0gZmlsZS5uYW1lOwogICAgIHRoZUNQQi5kaXJJbmZvLmlvVlJlZk51bSAgID0gZmlsZS52UmVmTnVtOwotICAvKnRoZUNQQi5oRmlsZUluZm8uaW9EaXJJRCAgID0gMDsqLworICAgIC8qdGhlQ1BCLmhGaWxlSW5mby5pb0RpcklEICAgPSAwOyovCiAgICAgdGhlQ1BCLmRpckluZm8uaW9EckRpcklEICAgPSBmaWxlLnBhcklEOwogCiAgICAgLyogQXMgaW9GRGlySW5kZXggPSAwLCBnZXQgdGhlIGluZm8gb2YgaW9OYW1lUHRyLApAQCAtNjA5Myw0ICs2MTEyLDQwNyBAQAogICAgIHJldHVybiAoc2NyaXB0ICE9IHNtUm9tYW4KIAkgICAgJiYgc2NyaXB0ID09IEdldFNjcmlwdE1hbmFnZXJWYXJpYWJsZShzbVN5c1NjcmlwdCkpID8gMSA6IDA7CiB9CisKICNlbmRpZiAvKiBkZWZpbmVkKFVTRV9JTV9DT05UUk9MKSB8fCBkZWZpbmVkKFBST1RPKSAqLworCisKKworCisjaWYgZGVmaW5lZChGRUFUX0dVSV9UQUJMSU5FKSB8fCBkZWZpbmVkKFBST1RPKQorLy8gZHJhd2VyIGltcGxlbWVudGF0aW9uCitzdGF0aWMgTWVudVJlZiBjb250ZXh0TWVudSA9IE5VTEw7CitlbnVtCit7CisgICAga1RhYkNvbnRleHRNZW51SWQgPSA0MiwKK307CisKKy8vIHRoZSBjYWxsZXIgaGFzIHRvIENGUmVsZWFzZSgpIHRoZSByZXR1cm5lZCBzdHJpbmcKKyAgICBzdGF0aWMgQ0ZTdHJpbmdSZWYKK2dldFRhYkxhYmVsKHRhYnBhZ2VfVCAqcGFnZSkKK3sKKyAgICBnZXRfdGFibGluZV9sYWJlbChwYWdlLCBGQUxTRSk7CisjaWZkZWYgTUFDT1NfQ09OVkVSVAorICAgIHJldHVybiBtYWNfZW5jX3RvX2Nmc3RyaW5nKE5hbWVCdWZmLCBTVFJMRU4oTmFtZUJ1ZmYpKTsKKyNlbHNlCisgICAgLy8gVE9ETzogY2hlY2sgaW50ZXJuYWwgZW5jb2Rpbmc/CisgICAgcmV0dXJuIENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoa0NGQWxsb2NhdG9yRGVmYXVsdCwgKGNoYXIgKilOYW1lQnVmZiwKKwkJCQkJCSAgIGtDRlN0cmluZ0VuY29kaW5nTWFjUm9tYW4pOworI2VuZGlmCit9CisKKworI2RlZmluZSBEUkFXRVJfU0laRSAxNTAKKyNkZWZpbmUgRFJBV0VSX0lOU0VUIDE2CisKK3N0YXRpYyBDb250cm9sUmVmIGRhdGFCcm93c2VyID0gTlVMTDsKKworLy8gd2hlbiB0aGUgdGFibGluZSBpcyBoaWRkZW4sIHZpbSBkb2Vzbid0IGNhbGwgdXBkYXRlX3RhYmxpbmUoKS4gV2hlbgorLy8gdGhlIHRhYmxpbmUgaXMgc2hvd24gYWdhaW4sIHNob3dfdGFibGluZSgpIGlzIGNhbGxlZCBiZWZvcmUgdXBhdGVfdGFibGluZSgpLAorLy8gYW5kIGJlY2F1c2Ugb2YgdGhpcywgdGhlIHRhYiBsYWJlbHMgYW5kIHZpbXMgaW50ZXJuYWwgdGFicyBhcmUgb3V0IG9mIHN5bmMKKy8vIGZvciBhIHZlcnkgc2hvcnQgdGltZS4gdG8gcHJldmVudCBpbmNvbnNpc3RlbnQgc3RhdGUsIHdlIHN0b3JlIHRoZSBsYWJlbHMKKy8vIG9mIHRoZSB0YWJzLCBub3QgcG9pbnRlcnMgdG8gdGhlIHRhYnMgKHdoaWNoIGFyZSBpbnZhbGlkIGZvciBhIHNob3J0IHRpbWUpLgorc3RhdGljIENGU3RyaW5nUmVmICp0YWJMYWJlbHMgPSBOVUxMOworc3RhdGljIGludCB0YWJMYWJlbHNTaXplID0gMDsKKworZW51bQoreworICAgIGtUYWJzQ29sdW1uID0gJ1RhYnMnCit9OworCisgICAgc3RhdGljIGludAorZ2V0VGFiQ291bnQodm9pZCkKK3sKKyAgICB0YWJwYWdlX1QJKnRwOworICAgIGludAkJbnVtVGFicyA9IDA7CisKKyAgICBmb3IgKHRwID0gZmlyc3RfdGFicGFnZTsgdHAgIT0gTlVMTDsgdHAgPSB0cC0+dHBfbmV4dCkKKyAgICAgICAgKytudW1UYWJzOworICAgIHJldHVybiBudW1UYWJzOworfQorCisvLyBkYXRhIGJyb3dzZXIgaXRlbSBkaXNwbGF5IGNhbGxiYWNrCisgICAgc3RhdGljIE9TU3RhdHVzCitkYkl0ZW1EYXRhQ2FsbGJhY2soQ29udHJvbFJlZiBicm93c2VyLAorCURhdGFCcm93c2VySXRlbUlEIGl0ZW1JRCwKKyAgICAgICAgRGF0YUJyb3dzZXJQcm9wZXJ0eUlEIHByb3BlcnR5IC8qIGNvbHVtbiBpZCAqLywKKyAgICAgICAgRGF0YUJyb3dzZXJJdGVtRGF0YVJlZiBpdGVtRGF0YSwKKwlCb29sZWFuIGNoYW5nZVZhbHVlKQoreworICAgIE9TU3RhdHVzIHN0YXR1cyA9IG5vRXJyOworCisgICAgLy8gYXNzZXJ0KHByb3BlcnR5ID09IGtUYWJzQ29sdW1uKTsgLy8gd2h5IGlzIHRoaXMgdmlvbGF0ZWQ/PworCisgICAgLy8gY2hhbmdlVmFsdWUgaXMgdHJ1ZSBpZiB3ZSBoYXZlIGEgbW9kaWZpZWFibGUgbGlzdCBhbmQgZGF0YSB3YXMgY2hhbmdlZC4KKyAgICAvLyBJbiBvdXIgY2FzZSwgaXQncyBhbHdheXMgZmFsc2UuCisgICAgLy8gKHRoYXQgaXM6IGlmIChjaGFuZ2VWYWx1ZSkgdXBkYXRlSW50ZXJuYWxEYXRhKCk7IGVsc2UgcmV0dXJuCisgICAgLy8gaW50ZXJuYWxEYXRhKCk7CisgICAgaWYgKCFjaGFuZ2VWYWx1ZSkKKyAgICB7CisJQ0ZTdHJpbmdSZWYgc3RyOworCisJYXNzZXJ0KGl0ZW1JRCAtIDEgPj0gMCAmJiBpdGVtSUQgLSAxIDwgdGFiTGFiZWxzU2l6ZSk7CisJc3RyID0gdGFiTGFiZWxzW2l0ZW1JRCAtIDFdOworCXN0YXR1cyA9IFNldERhdGFCcm93c2VySXRlbURhdGFUZXh0KGl0ZW1EYXRhLCBzdHIpOworICAgIH0KKyAgICBlbHNlCisJc3RhdHVzID0gZXJyRGF0YUJyb3dzZXJQcm9wZXJ0eU5vdFN1cHBvcnRlZDsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIGRhdGEgYnJvd3NlciBhY3Rpb24gY2FsbGJhY2sKKyAgICBzdGF0aWMgdm9pZAorZGJJdGVtTm90aWZpY2F0aW9uQ2FsbGJhY2soQ29udHJvbFJlZiBicm93c2VyLAorCURhdGFCcm93c2VySXRlbUlEIGl0ZW0sCisJRGF0YUJyb3dzZXJJdGVtTm90aWZpY2F0aW9uIG1lc3NhZ2UpCit7CisgICAgc3dpdGNoIChtZXNzYWdlKQorICAgIHsKKwljYXNlIGtEYXRhQnJvd3Nlckl0ZW1TZWxlY3RlZDoKKwkgICAgc2VuZF90YWJsaW5lX2V2ZW50KGl0ZW0pOworCSAgICBicmVhazsKKyAgICB9Cit9CisKKy8vIGNhbGxiYWNrcyBuZWVkZWQgZm9yIGNvbnRleHR1YWwgbWVudToKKyAgICBzdGF0aWMgdm9pZAorZGJHZXRDb250ZXh0dWFsTWVudUNhbGxiYWNrKENvbnRyb2xSZWYgYnJvd3NlciwKKwlNZW51UmVmICptZW51LAorICAgICAgICBVSW50MzIgKmhlbHBUeXBlLAorCUNGU3RyaW5nUmVmICpoZWxwSXRlbVN0cmluZywKKyAgICAgICAgQUVEZXNjICpzZWxlY3Rpb24pCit7CisgICAgLy8gb24gbWFjIG9zIDk6IGtDTUhlbHBJdGVtTm9IZWxwLCBidXQgaXQncyBub3QgdGhlIHNhbWUKKyAgICAqaGVscFR5cGUgPSBrQ01IZWxwSXRlbVJlbW92ZUhlbHA7IC8vIE9TIFggb25seSA7LSkKKyAgICAqaGVscEl0ZW1TdHJpbmcgPSBOVUxMOworCisgICAgKm1lbnUgPSBjb250ZXh0TWVudTsKK30KKworICAgIHN0YXRpYyB2b2lkCitkYlNlbGVjdENvbnRleHR1YWxNZW51Q2FsbGJhY2soQ29udHJvbFJlZiBicm93c2VyLAorCU1lbnVSZWYgbWVudSwKKwlVSW50MzIgc2VsZWN0aW9uVHlwZSwKKwlTSW50MTYgbWVudUlELAorCU1lbnVJdGVtSW5kZXggbWVudUl0ZW0pCit7CisgICAgaWYgKHNlbGVjdGlvblR5cGUgPT0ga0NNTWVudUl0ZW1TZWxlY3RlZCkKKyAgICB7CisJTWVudUNvbW1hbmQgY29tbWFuZDsKKwlHZXRNZW51SXRlbUNvbW1hbmRJRChtZW51LCBtZW51SXRlbSwgJmNvbW1hbmQpOworCisJLy8gZ2V0IHRhYiB0aGF0IHdhcyBzZWxlY3RlZCB3aGVuIHRoZSBjb250ZXh0IG1lbnUgYXBwZWFyZWQKKwkvLyAodGhlcmUgaXMgYWx3YXlzIG9uZSB0YWIgc2VsZWN0ZWQpLiBUT0RPOiBjaGVjayBpZiB0aGUgY29udGV4dCBtZW51CisJLy8gaXNuJ3Qgb3BlbmVkIG9uIGFuIGl0ZW0gYnV0IG9uIGVtcHR5IHNwYWNlIChoYXMgdG8gYmUgcG9zc2libGUgc29tZQorCS8vIHdheSwgdGhlIGZpbmRlciBkb2VzIGl0IHRvbyA7LSkgKQorCUhhbmRsZSBpdGVtcyA9IE5ld0hhbmRsZSgwKTsKKwlpZiAoaXRlbXMgIT0gTlVMTCkKKwl7CisJICAgIGludCBudW1JdGVtczsKKworCSAgICBHZXREYXRhQnJvd3Nlckl0ZW1zKGJyb3dzZXIsIGtEYXRhQnJvd3Nlck5vSXRlbSwgZmFsc2UsCisJCQkJCSAgIGtEYXRhQnJvd3Nlckl0ZW1Jc1NlbGVjdGVkLCBpdGVtcyk7CisJICAgIG51bUl0ZW1zID0gR2V0SGFuZGxlU2l6ZShpdGVtcykgLyBzaXplb2YoRGF0YUJyb3dzZXJJdGVtSUQpOworCSAgICBpZiAobnVtSXRlbXMgPiAwKQorCSAgICB7CisJCWludCBpZHg7CisJCURhdGFCcm93c2VySXRlbUlEICppdGVtc1B0cjsKKworCQlITG9jayhpdGVtcyk7CisJCWl0ZW1zUHRyID0gKERhdGFCcm93c2VySXRlbUlEICopKml0ZW1zOworCQlpZHggPSBpdGVtc1B0clswXTsKKwkJSFVubG9jayhpdGVtcyk7CisJCXNlbmRfdGFibGluZV9tZW51X2V2ZW50KGlkeCwgY29tbWFuZCk7CisJICAgIH0KKwkgICAgRGlzcG9zZUhhbmRsZShpdGVtcyk7CisJfQorICAgIH0KK30KKworLy8gZm9jdXMgY2FsbGJhY2sgb2YgdGhlIGRhdGEgYnJvd3NlciB0byBhbHdheXMgbGVhdmUgZm9jdXMgaW4gdmltCisgICAgc3RhdGljIE9TU3RhdHVzCitkYkZvY3VzQ2FsbGJhY2soRXZlbnRIYW5kbGVyQ2FsbFJlZiBoYW5kbGVyLCBFdmVudFJlZiBldmVudCwgdm9pZCAqZGF0YSkKK3sKKyAgICBhc3NlcnQoR2V0RXZlbnRDbGFzcyhldmVudCkgPT0ga0V2ZW50Q2xhc3NDb250cm9sCisJICAgICYmIEdldEV2ZW50S2luZChldmVudCkgPT0ga0V2ZW50Q29udHJvbFNldEZvY3VzUGFydCk7CisKKyAgICByZXR1cm4gcGFyYW1FcnI7Cit9CisKKworLy8gZHJhd2VyIGNhbGxiYWNrIHRvIHJlc2l6ZSBkYXRhIGJyb3dzZXIgdG8gZHJhd2VyIHNpemUKKyAgICBzdGF0aWMgT1NTdGF0dXMKK2RyYXdlckNhbGxiYWNrKEV2ZW50SGFuZGxlckNhbGxSZWYgaGFuZGxlciwgRXZlbnRSZWYgZXZlbnQsIHZvaWQgKmRhdGEpCit7CisgICAgc3dpdGNoIChHZXRFdmVudEtpbmQoZXZlbnQpKQorICAgIHsKKwljYXNlIGtFdmVudFdpbmRvd0JvdW5kc0NoYW5nZWQ6IC8vIG1vdmUgb3IgcmVzaXplCisJICAgIHsKKwkJVUludDMyIGF0dHJpYnM7CisJCUdldEV2ZW50UGFyYW1ldGVyKGV2ZW50LCBrRXZlbnRQYXJhbUF0dHJpYnV0ZXMsIHR5cGVVSW50MzIsCisJCQkJICAgICAgIE5VTEwsIHNpemVvZihhdHRyaWJzKSwgTlVMTCwgJmF0dHJpYnMpOworCQlpZiAoYXR0cmlicyAmIGtXaW5kb3dCb3VuZHNDaGFuZ2VTaXplQ2hhbmdlZCkgLy8gcmVzaXplCisJCXsKKwkJICAgIFJlY3QgcjsKKwkJICAgIEdldFdpbmRvd0JvdW5kcyhkcmF3ZXIsIGtXaW5kb3dDb250ZW50UmduLCAmcik7CisJCSAgICBTZXRSZWN0KCZyLCAwLCAwLCByLnJpZ2h0IC0gci5sZWZ0LCByLmJvdHRvbSAtIHIudG9wKTsKKwkJICAgIFNldENvbnRyb2xCb3VuZHMoZGF0YUJyb3dzZXIsICZyKTsKKwkJICAgIFNldERhdGFCcm93c2VyVGFibGVWaWV3TmFtZWRDb2x1bW5XaWR0aChkYXRhQnJvd3NlciwKKwkJCQkJCQlrVGFic0NvbHVtbiwgci5yaWdodCk7CisJCX0KKwkgICAgfQorCSAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZXZlbnROb3RIYW5kbGVkRXJyOworfQorCisvLyBMb2FkIERhdGFCcm93c2VyQ2hhbmdlQXR0cmlidXRlcygpIGR5bmFtaWNhbGx5IG9uIHRpZ2VyIChhbmQgYmV0dGVyKS4KKy8vIFRoaXMgd2F5IHRoZSBjb2RlIHdvcmtzIG9uIDEwLjIgYW5kIDEwLjMgYXMgd2VsbCAoaXQgZG9lc24ndCBoYXZlIHRoZQorLy8gYmx1ZSBoaWdobGlnaHRzIGluIHRoZSBsaXN0IHZpZXcgb24gdGhlc2Ugc3lzdGVtcywgdGhvdWdoLiBPaCB3ZWxsLikKKworCisjaW1wb3J0IDxtYWNoLW8vZHlsZC5oPgorCitlbnVtIHsga015RGF0YUJyb3dzZXJBdHRyaWJ1dGVMaXN0Vmlld0FsdGVybmF0aW5nUm93Q29sb3JzID0gKDEgPDwgMSkgfTsKKworICAgIHN0YXRpYyBPU1N0YXR1cworbXlEYXRhQnJvd3NlckNoYW5nZUF0dHJpYnV0ZXMoQ29udHJvbFJlZiBpbkRhdGFCcm93c2VyLAorCU9wdGlvbkJpdHMgaW5BdHRyaWJ1dGVzVG9TZXQsCisJT3B0aW9uQml0cyBpbkF0dHJpYnV0ZXNUb0NsZWFyKQoreworICAgIGxvbmcgb3NWZXJzaW9uOworICAgIGNoYXIgKnN5bWJvbE5hbWU7CisgICAgTlNTeW1ib2wgc3ltYm9sID0gTlVMTDsKKyAgICBPU1N0YXR1cyAoKmRhdGFCcm93c2VyQ2hhbmdlQXR0cmlidXRlcykoQ29udHJvbFJlZiBpbkRhdGFCcm93c2VyLAorCSAgICAgIE9wdGlvbkJpdHMgICBpbkF0dHJpYnV0ZXNUb1NldCwgT3B0aW9uQml0cyBpbkF0dHJpYnV0ZXNUb0NsZWFyKTsKKworICAgIEdlc3RhbHQoZ2VzdGFsdFN5c3RlbVZlcnNpb24sICZvc1ZlcnNpb24pOworICAgIGlmIChvc1ZlcnNpb24gPCAweDEwNDApIC8vIG9ubHkgc3VwcG9ydGVkIGZvciAxMC40IChhbmQgdXApCisJcmV0dXJuIG5vRXJyOworCisgICAgLy8gQyBuYW1lIG1hbmdsaW5nLi4uCisgICAgc3ltYm9sTmFtZSA9ICJfRGF0YUJyb3dzZXJDaGFuZ2VBdHRyaWJ1dGVzIjsKKyAgICBpZiAoIU5TSXNTeW1ib2xOYW1lRGVmaW5lZChzeW1ib2xOYW1lKQorCSAgICB8fCAoc3ltYm9sID0gTlNMb29rdXBBbmRCaW5kU3ltYm9sKHN5bWJvbE5hbWUpKSA9PSBOVUxMKQorCXJldHVybiBub0VycjsKKworICAgIGRhdGFCcm93c2VyQ2hhbmdlQXR0cmlidXRlcyA9IE5TQWRkcmVzc09mU3ltYm9sKHN5bWJvbCk7CisgICAgaWYgKGRhdGFCcm93c2VyQ2hhbmdlQXR0cmlidXRlcyA9PSBOVUxMKQorCXJldHVybiBub0VycjsgLy8gd2VsbC4uLgorICAgIHJldHVybiBkYXRhQnJvd3NlckNoYW5nZUF0dHJpYnV0ZXMoaW5EYXRhQnJvd3NlciwKKwkJCQkgICAgICBpbkF0dHJpYnV0ZXNUb1NldCwgaW5BdHRyaWJ1dGVzVG9DbGVhcik7Cit9CisKKyAgICBzdGF0aWMgdm9pZAoraW5pdGlhbGlzZV90YWJsaW5lKHZvaWQpCit7CisgICAgUmVjdCBkcmF3ZXJSZWN0ID0geyAwLCAwLCAwLCBEUkFXRVJfU0laRSB9OworICAgIERhdGFCcm93c2VyQ2FsbGJhY2tzIGRiQ2FsbGJhY2tzOworICAgIEV2ZW50VHlwZVNwZWMgZm9jdXNFdmVudCA9IHtrRXZlbnRDbGFzc0NvbnRyb2wsIGtFdmVudENvbnRyb2xTZXRGb2N1c1BhcnR9OworICAgIEV2ZW50VHlwZVNwZWMgcmVzaXplRXZlbnQgPSB7a0V2ZW50Q2xhc3NXaW5kb3csIGtFdmVudFdpbmRvd0JvdW5kc0NoYW5nZWR9OworICAgIERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjIGNvbERlc2M7CisKKyAgICAvLyBkcmF3ZXJzIGhhdmUgdG8gaGF2ZSBjb21wb3NpdGluZyBlbmFibGVkCisgICAgQ3JlYXRlTmV3V2luZG93KGtEcmF3ZXJXaW5kb3dDbGFzcywKKwkgICAga1dpbmRvd1N0YW5kYXJkSGFuZGxlckF0dHJpYnV0ZQorCQkgICAgfCBrV2luZG93Q29tcG9zaXRpbmdBdHRyaWJ1dGUKKwkJICAgIHwga1dpbmRvd1Jlc2l6YWJsZUF0dHJpYnV0ZQorCQkgICAgfCBrV2luZG93TGl2ZVJlc2l6ZUF0dHJpYnV0ZSwKKwkgICAgJmRyYXdlclJlY3QsICZkcmF3ZXIpOworCisgICAgU2V0VGhlbWVXaW5kb3dCYWNrZ3JvdW5kKGRyYXdlciwga1RoZW1lQnJ1c2hEcmF3ZXJCYWNrZ3JvdW5kLCB0cnVlKTsKKyAgICBTZXREcmF3ZXJQYXJlbnQoZHJhd2VyLCBndWkuVmltV2luZG93KTsKKyAgICBTZXREcmF3ZXJPZmZzZXRzKGRyYXdlciwga1dpbmRvd09mZnNldFVuY2hhbmdlZCwgRFJBV0VSX0lOU0VUKTsKKworCisgICAgLy8gY3JlYXRlIGxpc3QgdmlldyBlbWJlZGRlZCBpbiBkcmF3ZXIKKyAgICBDcmVhdGVEYXRhQnJvd3NlckNvbnRyb2woZHJhd2VyLCAmZHJhd2VyUmVjdCwga0RhdGFCcm93c2VyTGlzdFZpZXcsCisJCQkJCQkJCSZkYXRhQnJvd3Nlcik7CisKKyAgICBkYkNhbGxiYWNrcy52ZXJzaW9uID0ga0RhdGFCcm93c2VyTGF0ZXN0Q2FsbGJhY2tzOworICAgIEluaXREYXRhQnJvd3NlckNhbGxiYWNrcygmZGJDYWxsYmFja3MpOworICAgIGRiQ2FsbGJhY2tzLnUudjEuaXRlbURhdGFDYWxsYmFjayA9CisJCQkJTmV3RGF0YUJyb3dzZXJJdGVtRGF0YVVQUChkYkl0ZW1EYXRhQ2FsbGJhY2spOworICAgIGRiQ2FsbGJhY2tzLnUudjEuaXRlbU5vdGlmaWNhdGlvbkNhbGxiYWNrID0KKwkJTmV3RGF0YUJyb3dzZXJJdGVtTm90aWZpY2F0aW9uVVBQKGRiSXRlbU5vdGlmaWNhdGlvbkNhbGxiYWNrKTsKKyAgICBkYkNhbGxiYWNrcy51LnYxLmdldENvbnRleHR1YWxNZW51Q2FsbGJhY2sgPQorCSAgICAgIE5ld0RhdGFCcm93c2VyR2V0Q29udGV4dHVhbE1lbnVVUFAoZGJHZXRDb250ZXh0dWFsTWVudUNhbGxiYWNrKTsKKyAgICBkYkNhbGxiYWNrcy51LnYxLnNlbGVjdENvbnRleHR1YWxNZW51Q2FsbGJhY2sgPQorCU5ld0RhdGFCcm93c2VyU2VsZWN0Q29udGV4dHVhbE1lbnVVUFAoZGJTZWxlY3RDb250ZXh0dWFsTWVudUNhbGxiYWNrKTsKKworICAgIFNldERhdGFCcm93c2VyQ2FsbGJhY2tzKGRhdGFCcm93c2VyLCAmZGJDYWxsYmFja3MpOworCisgICAgU2V0RGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckJ0bkhlaWdodChkYXRhQnJvd3NlciwgMCk7IC8vIG5vIGhlYWRlcgorICAgIFNldERhdGFCcm93c2VySGFzU2Nyb2xsQmFycyhkYXRhQnJvd3NlciwgZmFsc2UsIHRydWUpOyAvLyBvbmx5IHZlcnRpY2FsCisgICAgU2V0RGF0YUJyb3dzZXJTZWxlY3Rpb25GbGFncyhkYXRhQnJvd3NlciwKKwkgICAgICBrRGF0YUJyb3dzZXJTZWxlY3RPbmx5T25lIHwga0RhdGFCcm93c2VyTmV2ZXJFbXB0eVNlbGVjdGlvblNldCk7CisgICAgU2V0RGF0YUJyb3dzZXJUYWJsZVZpZXdIaWxpdGVTdHlsZShkYXRhQnJvd3NlciwKKwkJCQkJICAgICBrRGF0YUJyb3dzZXJUYWJsZVZpZXdGaWxsSGlsaXRlKTsKKyAgICBCb29sZWFuIGIgPSBmYWxzZTsKKyAgICBTZXRDb250cm9sRGF0YShkYXRhQnJvd3Nlciwga0NvbnRyb2xFbnRpcmVDb250cm9sLAorCQkgIGtDb250cm9sRGF0YUJyb3dzZXJJbmNsdWRlc0ZyYW1lQW5kRm9jdXNUYWcsIHNpemVvZihiKSwgJmIpOworCisgICAgLy8gZW5hYmxlIGJsdWUgYmFja2dyb3VuZCBpbiBkYXRhIGJyb3dzZXIgKHRoaXMgaXMgb25seSBpbiAxMC40IGFuZCB2aW0KKyAgICAvLyBoYXMgdG8gc3VwcG9ydCBvbGRlciBvc3ggdmVyc2lvbnMgYXMgd2VsbCwgc28gd2UgaGF2ZSB0byBsb2FkIHRoaXMKKyAgICAvLyBmdW5jdGlvbiBkeW5hbWljYWxseSkKKyAgICBteURhdGFCcm93c2VyQ2hhbmdlQXR0cmlidXRlcyhkYXRhQnJvd3NlciwKKwkJICAgICAga015RGF0YUJyb3dzZXJBdHRyaWJ1dGVMaXN0Vmlld0FsdGVybmF0aW5nUm93Q29sb3JzLCAwKTsKKworICAgIC8vIGluc3RhbGwgY2FsbGJhY2sgdGhhdCBrZWVwcyBmb2N1cyBpbiB2aW0gYW5kIGF3YXkgZnJvbSB0aGUgZGF0YSBicm93c2VyCisgICAgSW5zdGFsbENvbnRyb2xFdmVudEhhbmRsZXIoZGF0YUJyb3dzZXIsIGRiRm9jdXNDYWxsYmFjaywgMSwgJmZvY3VzRXZlbnQsCisJCQkJCQkJCSAgTlVMTCwgTlVMTCk7CisKKyAgICAvLyBpbnN0YWxsIGNhbGxiYWNrIHRoYXQga2VlcHMgZGF0YSBicm93c2VyIGF0IHRoZSBzaXplIG9mIHRoZSBkcmF3ZXIKKyAgICBJbnN0YWxsV2luZG93RXZlbnRIYW5kbGVyKGRyYXdlciwgZHJhd2VyQ2FsbGJhY2ssIDEsICZyZXNpemVFdmVudCwKKwkJCQkJCQkJICBOVUxMLCBOVUxMKTsKKworICAgIC8vIGFkZCAidGFicyIgY29sdW1uIHRvIGRhdGEgYnJvd3NlcgorICAgIGNvbERlc2MucHJvcGVydHlEZXNjLnByb3BlcnR5SUQgPSBrVGFic0NvbHVtbjsKKyAgICBjb2xEZXNjLnByb3BlcnR5RGVzYy5wcm9wZXJ0eVR5cGUgPSBrRGF0YUJyb3dzZXJUZXh0VHlwZTsKKworICAgIC8vIGFkZCBpZiBpdGVtcyBjYW4gYmUgc2VsZWN0ZWQgKD8pOiBrRGF0YUJyb3dzZXJMaXN0Vmlld1NlbGVjdGlvbkNvbHVtbgorICAgIGNvbERlc2MucHJvcGVydHlEZXNjLnByb3BlcnR5RmxhZ3MgPSBrRGF0YUJyb3dzZXJEZWZhdWx0UHJvcGVydHlGbGFnczsKKworICAgIGNvbERlc2MuaGVhZGVyQnRuRGVzYy52ZXJzaW9uID0ga0RhdGFCcm93c2VyTGlzdFZpZXdMYXRlc3RIZWFkZXJEZXNjOworICAgIGNvbERlc2MuaGVhZGVyQnRuRGVzYy5taW5pbXVtV2lkdGggPSAxMDA7CisgICAgY29sRGVzYy5oZWFkZXJCdG5EZXNjLm1heGltdW1XaWR0aCA9IDE1MDsKKyAgICBjb2xEZXNjLmhlYWRlckJ0bkRlc2MudGl0bGVPZmZzZXQgPSAwOworICAgIGNvbERlc2MuaGVhZGVyQnRuRGVzYy50aXRsZVN0cmluZyA9IENGU1RSKCJUYWJzIik7CisgICAgY29sRGVzYy5oZWFkZXJCdG5EZXNjLmluaXRpYWxPcmRlciA9IGtEYXRhQnJvd3Nlck9yZGVySW5jcmVhc2luZzsKKyAgICBjb2xEZXNjLmhlYWRlckJ0bkRlc2MuYnRuRm9udFN0eWxlLmZsYWdzID0gMDsgLy8gdXNlIGRlZmF1bHQgZm9udAorICAgIGNvbERlc2MuaGVhZGVyQnRuRGVzYy5idG5Db250ZW50SW5mby5jb250ZW50VHlwZSA9IGtDb250cm9sQ29udGVudFRleHRPbmx5OworCisgICAgQWRkRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbihkYXRhQnJvd3NlciwgJmNvbERlc2MsIDApOworCisgICAgLy8gY3JlYXRlIHRhYmxpbmUgcG9wdXAgbWVudSByZXF1aXJlZCBieSB2aW0gZG9jcyAoc2VlIDpoZSB0YWJsaW5lLW1lbnUpCisgICAgQ3JlYXRlTmV3TWVudShrVGFiQ29udGV4dE1lbnVJZCwgMCwgJmNvbnRleHRNZW51KTsKKyAgICBBcHBlbmRNZW51SXRlbVRleHRXaXRoQ0ZTdHJpbmcoY29udGV4dE1lbnUsIENGU1RSKCJDbG9zZSIpLCAwLAorCQkJCQkJICAgIFRBQkxJTkVfTUVOVV9DTE9TRSwgTlVMTCk7CisgICAgQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKGNvbnRleHRNZW51LCBDRlNUUigiTmV3IFRhYiIpLCAwLAorCQkJCQkJICAgICAgVEFCTElORV9NRU5VX05FVywgTlVMTCk7CisgICAgQXBwZW5kTWVudUl0ZW1UZXh0V2l0aENGU3RyaW5nKGNvbnRleHRNZW51LCBDRlNUUigiT3BlbiBUYWIuLi4iKSwgMCwKKwkJCQkJCSAgICAgVEFCTElORV9NRU5VX09QRU4sIE5VTEwpOworfQorCisKKy8qCisgKiBTaG93IG9yIGhpZGUgdGhlIHRhYmxpbmUuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3Nob3dfdGFibGluZShpbnQgc2hvd2l0KQoreworICAgIGlmIChzaG93aXQgPT0gMCkKKyAgICAgICAgQ2xvc2VEcmF3ZXIoZHJhd2VyLCB0cnVlKTsKKyAgICBlbHNlCisgICAgICAgIE9wZW5EcmF3ZXIoZHJhd2VyLCBrV2luZG93RWRnZVJpZ2h0LCB0cnVlKTsKK30KKworLyoKKyAqIFJldHVybiBUUlVFIHdoZW4gdGFibGluZSBpcyBkaXNwbGF5ZWQuCisgKi8KKyAgICBpbnQKK2d1aV9tY2hfc2hvd2luZ190YWJsaW5lKHZvaWQpCit7CisgICAgV2luZG93RHJhd2VyU3RhdGUgc3RhdGUgPSBHZXREcmF3ZXJTdGF0ZShkcmF3ZXIpOworCisgICAgcmV0dXJuIHN0YXRlID09IGtXaW5kb3dEcmF3ZXJPcGVuIHx8IHN0YXRlID09IGtXaW5kb3dEcmF3ZXJPcGVuaW5nOworfQorCisvKgorICogVXBkYXRlIHRoZSBsYWJlbHMgb2YgdGhlIHRhYmxpbmUuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3VwZGF0ZV90YWJsaW5lKHZvaWQpCit7CisgICAgdGFicGFnZV9UCSp0cDsKKyAgICBpbnQJCW51bVRhYnMgPSBnZXRUYWJDb3VudCgpOworICAgIGludAkJbnIgPSAxOworICAgIGludAkJY3VydGFiaWR4ID0gMTsKKworICAgIC8vIGFkanVzdCBkYXRhIGJyb3dzZXIKKyAgICBpZiAodGFiTGFiZWxzICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGFiTGFiZWxzU2l6ZTsgKytpKQorICAgICAgICAgICAgQ0ZSZWxlYXNlKHRhYkxhYmVsc1tpXSk7CisgICAgICAgIGZyZWUodGFiTGFiZWxzKTsKKyAgICB9CisgICAgdGFiTGFiZWxzID0gKENGU3RyaW5nUmVmICopbWFsbG9jKG51bVRhYnMgKiBzaXplb2YoQ0ZTdHJpbmdSZWYpKTsKKyAgICB0YWJMYWJlbHNTaXplID0gbnVtVGFiczsKKworICAgIGZvciAodHAgPSBmaXJzdF90YWJwYWdlOyB0cCAhPSBOVUxMOyB0cCA9IHRwLT50cF9uZXh0LCArK25yKQorICAgIHsKKwlpZiAodHAgPT0gY3VydGFiKQorCSAgICBjdXJ0YWJpZHggPSBucjsKKyAgICAgICAgdGFiTGFiZWxzW25yLTFdID0gZ2V0VGFiTGFiZWwodHApOworICAgIH0KKworICAgIFJlbW92ZURhdGFCcm93c2VySXRlbXMoZGF0YUJyb3dzZXIsIGtEYXRhQnJvd3Nlck5vSXRlbSwgMCwgTlVMTCwKKwkJCQkJCSAga0RhdGFCcm93c2VySXRlbU5vUHJvcGVydHkpOworICAgIC8vIGRhdGEgYnJvd3NlciB1c2VzIGlkcyAxLCAyLCAzLCAuLi4gbnVtVGFicyBwZXIgZGVmYXVsdCwgc28gd2UKKyAgICAvLyBjYW4gcGFzcyBOVUxMIGZvciB0aGUgaWQgYXJyYXkKKyAgICBBZGREYXRhQnJvd3Nlckl0ZW1zKGRhdGFCcm93c2VyLCBrRGF0YUJyb3dzZXJOb0l0ZW0sIG51bVRhYnMsIE5VTEwsCisJCQkJCQkgIGtEYXRhQnJvd3Nlckl0ZW1Ob1Byb3BlcnR5KTsKKworICAgIERhdGFCcm93c2VySXRlbUlEIGl0ZW0gPSBjdXJ0YWJpZHg7CisgICAgU2V0RGF0YUJyb3dzZXJTZWxlY3RlZEl0ZW1zKGRhdGFCcm93c2VyLCAxLCAmaXRlbSwga0RhdGFCcm93c2VySXRlbXNBc3NpZ24pOworfQorCisvKgorICogU2V0IHRoZSBjdXJyZW50IHRhYiB0byAibnIiLiAgRmlyc3QgdGFiIGlzIDEuCisgKi8KKyAgICB2b2lkCitndWlfbWNoX3NldF9jdXJ0YWIobnIpCisgICAgaW50CQlucjsKK3sKKyAgICBEYXRhQnJvd3Nlckl0ZW1JRCBpdGVtID0gbnI7CisgICAgU2V0RGF0YUJyb3dzZXJTZWxlY3RlZEl0ZW1zKGRhdGFCcm93c2VyLCAxLCAmaXRlbSwga0RhdGFCcm93c2VySXRlbXNBc3NpZ24pOworCisgICAgLy8gVE9ETzogY2FsbCBzb21ldGhpbmcgbGlrZSB0aGlzPzogKG9yIHJlc3RvcmUgc2Nyb2xsIHBvc2l0aW9uLCBvci4uLikKKyAgICBSZXZlYWxEYXRhQnJvd3Nlckl0ZW0oZGF0YUJyb3dzZXIsIGl0ZW0sIGtUYWJzQ29sdW1uLAorCQkJCQkJICAgICAga0RhdGFCcm93c2VyUmV2ZWFsT25seSk7Cit9CisKKyNlbmRpZiAvLyBGRUFUX0dVSV9UQUJMSU5FCg==