ZGlmZiAtLWdpdCBhL2RvYy90dXBsZV91c2Vyc19ndWlkZS5xYmsgYi9kb2MvdHVwbGVfdXNlcnNfZ3VpZGUucWJrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZDAzZTYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2MvdHVwbGVfdXNlcnNfZ3VpZGUucWJrCkBAIC0wLDAgKzEsNTI1IEBACitbLworIC8gIENvcHlyaWdodCAoYykgMjAwMSBKYWFra28gSuRydmkKKyAvCisgLyBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUKKyAvIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CisgLyBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCisgL10KKworW2xpYnJhcnkgQm9vc3QuVHVwbGUKKyAgW3F1aWNrYm9vayAxLjZdCisgIFtpZCB0dXBsZV0KKyAgW2NvcHlyaWdodCAyMDAxIEphYWtrbyBKXHUwMEU0cnZpXQorICBbZGlybmFtZSB0dXBsZV0KKyAgW2xpY2Vuc2UgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlCisgICAgW0BodHRwOi8vYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLAorICAgICAgVmVyc2lvbiAxLjBdLgorICBdCitdCisKK1tpbmNsdWRlIHR1cGxlX2FkdmFuY2VkX2ludGVyZmFjZS5xYmtdCitbaW5jbHVkZSBkZXNpZ25fZGVjaXNpb25zX3JhdGlvbmFsZS5xYmtdCisKK1t0ZW1wbGF0ZSBzaW1wbGVzZWN0W3RpdGxlXQorW2Jsb2NrICcnJzxzaW1wbGVzZWN0Pjx0aXRsZT4nJydbdGl0bGVdJycnPC90aXRsZT4nJyddXQorCitbdGVtcGxhdGUgZW5kc2ltcGxlc2VjdFtdCitbYmxvY2sgJycnPC9zaW1wbGVzZWN0PicnJ11dCisKK0EgdHVwbGUgKG9yIG4tdHVwbGUpIGlzIGEgZml4ZWQgc2l6ZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzLiBQYWlycywgdHJpcGxlcywKK3F1YWRydXBsZXMgZXRjLiBhcmUgdHVwbGVzLiBJbiBhIHByb2dyYW1taW5nIGxhbmd1YWdlLCBhIHR1cGxlIGlzIGEgZGF0YQorb2JqZWN0IGNvbnRhaW5pbmcgb3RoZXIgb2JqZWN0cyBhcyBlbGVtZW50cy4gVGhlc2UgZWxlbWVudCBvYmplY3RzIG1heSBiZSBvZgorZGlmZmVyZW50IHR5cGVzLgorCitUdXBsZXMgYXJlIGNvbnZlbmllbnQgaW4gbWFueSBjaXJjdW1zdGFuY2VzLiBGb3IgaW5zdGFuY2UsIHR1cGxlcyBtYWtlIGl0IGVhc3kKK3RvIGRlZmluZSBmdW5jdGlvbnMgdGhhdCByZXR1cm4gbW9yZSB0aGFuIG9uZSB2YWx1ZS4KKworU29tZSBwcm9ncmFtbWluZyBsYW5ndWFnZXMsIHN1Y2ggYXMgTUwsIFB5dGhvbiBhbmQgSGFza2VsbCwgaGF2ZSBidWlsdC1pbgordHVwbGUgY29uc3RydWN0cy4gVW5mb3J0dW5hdGVseSBDKysgZG9lcyBub3QuIFRvIGNvbXBlbnNhdGUgZm9yIHRoaXMKKyJkZWZpY2llbmN5IiwgdGhlIEJvb3N0IFR1cGxlIExpYnJhcnkgaW1wbGVtZW50cyBhIHR1cGxlIGNvbnN0cnVjdCB1c2luZwordGVtcGxhdGVzLgorCitbc2VjdGlvbjp1c2luZ19saWJyYXJ5IFVzaW5nIHRoZSBMaWJyYXJ5XQorCitUbyB1c2UgdGhlIGxpYnJhcnksIGp1c3QgaW5jbHVkZToKKworICAgICNpbmNsdWRlICJib29zdC90dXBsZS90dXBsZS5ocHAiCisKK0NvbXBhcmlzb24gb3BlcmF0b3JzIGNhbiBiZSBpbmNsdWRlZCB3aXRoOgorCisgICAgI2luY2x1ZGUgImJvb3N0L3R1cGxlL3R1cGxlX2NvbXBhcmlzb24uaHBwIgorCitUbyB1c2UgdHVwbGUgaW5wdXQgYW5kIG91dHB1dCBvcGVyYXRvcnMsCisKKyAgICAjaW5jbHVkZSAiYm9vc3QvdHVwbGUvdHVwbGVfaW8uaHBwIgorCitCb3RoIGB0dXBsZV9pby5ocHBgIGFuZCBgdHVwbGVfY29tcGFyaXNvbi5ocHBgIGluY2x1ZGUgYHR1cGxlLmhwcGAuCisKK0FsbCBkZWZpbml0aW9ucyBhcmUgaW4gbmFtZXNwYWNlIGA6OmJvb3N0Ojp0dXBsZXNgLCBidXQgdGhlIG1vc3QgY29tbW9uIG5hbWVzCithcmUgbGlmdGVkIHRvIG5hbWVzcGFjZSBgOjpib29zdGAgd2l0aCB1c2luZyBkZWNsYXJhdGlvbnMuIFRoZXNlIG5hbWVzIGFyZToKK2B0dXBsZWAsIGBtYWtlX3R1cGxlYCwgYHRpZWAgYW5kIGBnZXRgLiBGdXJ0aGVyLCBgcmVmYCBhbmQgYGNyZWZgIGFyZSBkZWZpbmVkCitkaXJlY3RseSB1bmRlciB0aGUgYDo6Ym9vc3RgIG5hbWVzcGFjZS4KKworW2VuZHNlY3RdCisKK1tzZWN0aW9uOnR1cGxlX3R5cGVzIFR1cGxlIFR5cGVzXQorCitBIHR1cGxlIHR5cGUgaXMgYW4gaW5zdGFudGlhdGlvbiBvZiB0aGUgYHR1cGxlYCB0ZW1wbGF0ZS4gVGhlIHRlbXBsYXRlCitwYXJhbWV0ZXJzIHNwZWNpZnkgdGhlIHR5cGVzIG9mIHRoZSB0dXBsZSBlbGVtZW50cy4gVGhlIGN1cnJlbnQgdmVyc2lvbgorc3VwcG9ydHMgdHVwbGVzIHdpdGggMC0xMCBlbGVtZW50cy4gSWYgbmVjZXNzYXJ5LCB0aGUgdXBwZXIgbGltaXQgY2FuIGJlCitpbmNyZWFzZWQgdXAgdG8sIHNheSwgYSBmZXcgZG96ZW4gZWxlbWVudHMuIFRoZSBkYXRhIGVsZW1lbnQgY2FuIGJlIGFueSBDKysKK3R5cGUuIE5vdGUgdGhhdCBgdm9pZGAgYW5kIHBsYWluIGZ1bmN0aW9uIHR5cGVzIGFyZSB2YWxpZCBDKysgdHlwZXMsIGJ1dAorb2JqZWN0cyBvZiBzdWNoIHR5cGVzIGNhbm5vdCBleGlzdC4gSGVuY2UsIGlmIGEgdHVwbGUgdHlwZSBjb250YWlucyBzdWNoIHR5cGVzCithcyBlbGVtZW50cywgdGhlIHR1cGxlIHR5cGUgY2FuIGV4aXN0LCBidXQgbm90IGFuIG9iamVjdCBvZiB0aGF0IHR5cGUuIFRoZXJlCithcmUgbmF0dXJhbCBsaW1pdGF0aW9ucyBmb3IgZWxlbWVudCB0eXBlcyB0aGF0IGNhbm5vdCBiZSBjb3BpZWQsIG9yIHRoYXQgYXJlCitub3QgZGVmYXVsdCBjb25zdHJ1Y3RpYmxlIChzZWUgW2xpbmsgdHVwbGUuY29uc3RydWN0aW5nX3R1cGxlcyAnQ29uc3RydWN0aW5nIHR1cGxlcyddCitiZWxvdykuCisKK0ZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSB2YWxpZCB0dXBsZSBpbnN0YW50aWF0aW9ucyAoYEFgLAorYEJgIGFuZCBgQ2AgYXJlIHNvbWUgdXNlciBkZWZpbmVkIGNsYXNzZXMpOgorCisgICAgdHVwbGU8aW50PgorICAgIHR1cGxlPGRvdWJsZSYsIGNvbnN0IGRvdWJsZSYsIGNvbnN0IGRvdWJsZSwgZG91YmxlKiwgY29uc3QgZG91YmxlKj4KKyAgICB0dXBsZTxBLCBpbnQoKikoY2hhciwgaW50KSwgQihBOjoqKShDJiksIEM+CisgICAgdHVwbGU8c3RkOjpzdHJpbmcsIHN0ZDo6cGFpcjxBLCBCPiA+CisgICAgdHVwbGU8QSosIHR1cGxlPGNvbnN0IEEqLCBjb25zdCBCJiwgQz4sIGJvb2wsIHZvaWQqPgorCitbZW5kc2VjdF0KKworW3NlY3Rpb246Y29uc3RydWN0aW5nX3R1cGxlcyBDb25zdHJ1Y3RpbmcgVHVwbGVzXQorCitUaGUgdHVwbGUgY29uc3RydWN0b3IgdGFrZXMgdGhlIHR1cGxlIGVsZW1lbnRzIGFzIGFyZ3VtZW50cy4gRm9yIGFuIC9uLy0KK2VsZW1lbnQgdHVwbGUsIHRoZSBjb25zdHJ1Y3RvciBjYW4gYmUgaW52b2tlZCB3aXRoIC9rLyBhcmd1bWVudHMsIHdoZXJlCitgMGAgPD0gL2svIDw9IC9uLy4gRm9yIGV4YW1wbGU6CisKKyAgICB0dXBsZTxpbnQsIGRvdWJsZT4oKQorICAgIHR1cGxlPGludCwgZG91YmxlPigxKQorICAgIHR1cGxlPGludCwgZG91YmxlPigxLCAzLjE0KQorCitJZiBubyBpbml0aWFsIHZhbHVlIGZvciBhbiBlbGVtZW50IGlzIHByb3ZpZGVkLCBpdCBpcyBkZWZhdWx0IGluaXRpYWxpemVkCisoYW5kIGhlbmNlIG11c3QgYmUgZGVmYXVsdCBpbml0aWFsaXphYmxlKS4gRm9yIGV4YW1wbGU6CisKKyAgICBjbGFzcyBYIHsKKyAgICAgIFgoKTsKKyAgICBwdWJsaWM6CisgICAgICBYKHN0ZDo6c3RyaW5nKTsKKyAgICB9OworCisgICAgdHVwbGU8WCxYLFg+KCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3I6IG5vIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIFgKKyAgICB0dXBsZTxYLFgsWD4oc3RyaW5nKCJKYWJhIiksIHN0cmluZygiRGFiYSIpLCBzdHJpbmcoIkR1dSIpKSAvLyBvaworCitJbiBwYXJ0aWN1bGFyLCByZWZlcmVuY2UgdHlwZXMgZG8gbm90IGhhdmUgYSBkZWZhdWx0IGluaXRpYWxpemF0aW9uOgorCisgICAgdHVwbGU8ZG91YmxlJj4oKSAgICAgICAgICAgICAgICAvLyBlcnJvcjogcmVmZXJlbmNlIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemVkIGV4cGxpY2l0bHkKKworICAgIGRvdWJsZSBkID0gNTsKKyAgICB0dXBsZTxkb3VibGUmPihkKSAgICAgICAgICAgICAgIC8vIG9rCisKKyAgICB0dXBsZTxkb3VibGUmPihkKzMuMTQpICAgICAgICAgIC8vIGVycm9yOiBjYW5ub3QgaW5pdGlhbGl6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLWNvbnN0IHJlZmVyZW5jZSB3aXRoIGEgdGVtcG9yYXJ5CisKKyAgICB0dXBsZTxjb25zdCBkb3VibGUmPihkKzMuMTQpICAgIC8vIG9rLCBidXQgZGFuZ2Vyb3VzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgYmVjb21lcyBhIGRhbmdsaW5nIHJlZmVyZW5jZQorCitVc2luZyBhbiBpbml0aWFsIHZhbHVlIGZvciBhbiBlbGVtZW50IHRoYXQgY2Fubm90IGJlIGNvcGllZCwgaXMgYSBjb21waWxlIHRpbWUKK2Vycm9yOgorCisgICAgY2xhc3MgWSB7CisgICAgICBZKGNvbnN0IFkmKTsKKyAgICBwdWJsaWM6CisgICAgICBZKCk7CisgICAgfTsKKworICAgIGNoYXIgYVsxMF07CisKKyAgICB0dXBsZTxjaGFyWzEwXSwgWT4oYSwgWSgpKTsgLy8gZXJyb3IsIG5laXRoZXIgYXJyYXlzIG5vciBZIGNhbiBiZSBjb3BpZWQKKyAgICB0dXBsZTxjaGFyWzEwXSwgWT4oKTsgICAgICAgLy8gb2sKKworTm90ZSBwYXJ0aWN1bGFybHkgdGhhdCB0aGUgZm9sbG93aW5nIGlzIHBlcmZlY3RseSBvazoKKworICAgIFkgeTsKKyAgICB0dXBsZTxjaGFyKCYpWzEwXSwgWSY+KGEsIHkpOworCitJdCBpcyBwb3NzaWJsZSB0byBjb21lIHVwIHdpdGggYSB0dXBsZSB0eXBlIHRoYXQgY2Fubm90IGJlIGNvbnN0cnVjdGVkLiBUaGlzCitvY2N1cnMgaWYgYW4gZWxlbWVudCB0aGF0IGNhbm5vdCBiZSBpbml0aWFsaXplZCBoYXMgYSBsb3dlciBpbmRleCB0aGFuIGFuCitlbGVtZW50IHRoYXQgcmVxdWlyZXMgaW5pdGlhbGl6YXRpb24uIEZvciBleGFtcGxlOiBgdHVwbGU8Y2hhclsxMF0sIGludCY+YC4KKworSW4gc3VtLCB0aGUgdHVwbGUgY29uc3RydWN0aW9uIGlzIHNlbWFudGljYWxseSBqdXN0IGEgZ3JvdXAgb2YgaW5kaXZpZHVhbAorZWxlbWVudGFyeSBjb25zdHJ1Y3Rpb25zLgorCitbc2VjdGlvbjptYWtlX3R1cGxlIFRoZSBgbWFrZV90dXBsZWAgZnVuY3Rpb25dCisKK1R1cGxlcyBjYW4gYWxzbyBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgYG1ha2VfdHVwbGVgIChjZi4gYHN0ZDo6bWFrZV9wYWlyYCkKK2hlbHBlciBmdW5jdGlvbnMuIFRoaXMgbWFrZXMgdGhlIGNvbnN0cnVjdGlvbiBtb3JlIGNvbnZlbmllbnQsIHNhdmluZyB0aGUKK3Byb2dyYW1tZXIgZnJvbSBleHBsaWNpdGx5IHNwZWNpZnlpbmcgdGhlIGVsZW1lbnQgdHlwZXM6CisKKyAgICB0dXBsZTxpbnQsIGludCwgZG91YmxlPiBhZGRfbXVsdGlwbHlfZGl2aWRlKGludCBhLCBpbnQgYikgeworICAgICAgcmV0dXJuIG1ha2VfdHVwbGUoYStiLCBhKmIsIGRvdWJsZShhKS9kb3VibGUoYikpOworICAgIH0KKworQnkgZGVmYXVsdCwgdGhlIGVsZW1lbnQgdHlwZXMgYXJlIGRlZHVjZWQgdG8gdGhlIHBsYWluIG5vbi1yZWZlcmVuY2UgdHlwZXMuCitFLmcuOgorCisgICAgdm9pZCBmb28oY29uc3QgQSYgYSwgQiYgYikgeworICAgICAgLi4uCisgICAgICBtYWtlX3R1cGxlKGEsIGIpOworCitUaGUgYG1ha2VfdHVwbGVgIGludm9jYXRpb24gcmVzdWx0cyBpbiBhIHR1cGxlIG9mIHR5cGUgYHR1cGxlPEEsIEI+YC4KKworU29tZXRpbWVzIHRoZSBwbGFpbiBub24tcmVmZXJlbmNlIHR5cGUgaXMgbm90IGRlc2lyZWQsIGUuZy4gaWYgdGhlIGVsZW1lbnQKK3R5cGUgY2Fubm90IGJlIGNvcGllZC4gVGhlcmVmb3JlLCB0aGUgcHJvZ3JhbW1lciBjYW4gY29udHJvbCB0aGUgdHlwZQorZGVkdWN0aW9uIGFuZCBzdGF0ZSB0aGF0IGEgcmVmZXJlbmNlIHRvIGNvbnN0IG9yIHJlZmVyZW5jZSB0byBub24tY29uc3QgdHlwZQorc2hvdWxkIGJlIHVzZWQgYXMgdGhlIGVsZW1lbnQgdHlwZSBpbnN0ZWFkLiBUaGlzIGlzIGFjY29tcGxpc2hlZCB3aXRoIHR3bworaGVscGVyIHRlbXBsYXRlIGZ1bmN0aW9uczogW0Bib29zdDovbGlicy9jb3JlL2RvYy9odG1sL2NvcmUvcmVmLmh0bWwgYGJvb3N0OjpyZWZgXQorYW5kIFtAYm9vc3Q6L2xpYnMvY29yZS9kb2MvaHRtbC9jb3JlL3JlZi5odG1sIGBib29zdDo6Y3JlZmBdLiBBbnkgYXJndW1lbnQgY2FuCitiZSB3cmFwcGVkIHdpdGggdGhlc2UgZnVuY3Rpb25zIHRvIGdldCB0aGUgZGVzaXJlZCB0eXBlLiBUaGUgbWVjaGFuaXNtIGRvZXMKK25vdCBjb21wcm9taXNlIGNvbnN0IGNvcnJlY3RuZXNzIHNpbmNlIGEgY29uc3Qgb2JqZWN0IHdyYXBwZWQgd2l0aCByZWYgcmVzdWx0cworaW4gYSB0dXBsZSBlbGVtZW50IHdpdGggY29uc3QgcmVmZXJlbmNlIHR5cGUgKHNlZSB0aGUgZmlmdGggZXhhbXBsZSBiZWxvdykuCitGb3IgZXhhbXBsZToKKworICAgIEEgYTsgQiBiOyBjb25zdCBBIGNhID0gYTsKKyAgICBtYWtlX3R1cGxlKGNyZWYoYSksIGIpOyAgICAgIC8vIGNyZWF0ZXMgdHVwbGU8Y29uc3QgQSYsIEI+CisgICAgbWFrZV90dXBsZShyZWYoYSksIGIpOyAgICAgICAvLyBjcmVhdGVzIHR1cGxlPEEmLCBCPgorICAgIG1ha2VfdHVwbGUocmVmKGEpLCBjcmVmKGIpKTsgLy8gY3JlYXRlcyB0dXBsZTxBJiwgY29uc3QgQiY+CisgICAgbWFrZV90dXBsZShjcmVmKGNhKSk7ICAgICAgICAvLyBjcmVhdGVzIHR1cGxlPGNvbnN0IEEmPgorICAgIG1ha2VfdHVwbGUocmVmKGNhKSk7ICAgICAgICAgLy8gY3JlYXRlcyB0dXBsZTxjb25zdCBBJj4KKworQXJyYXkgYXJndW1lbnRzIHRvIGBtYWtlX3R1cGxlYCBmdW5jdGlvbnMgYXJlIGRlZHVjZWQgdG8gcmVmZXJlbmNlIHRvIGNvbnN0Cit0eXBlcyBieSBkZWZhdWx0OyB0aGVyZSBpcyBubyBuZWVkIHRvIHdyYXAgdGhlbSB3aXRoIGBjcmVmYC4gRm9yIGV4YW1wbGU6CisKKyAgICBtYWtlX3R1cGxlKCJEb25hbGQiLCAiRGFpc3kiKTsKKworVGhpcyBjcmVhdGVzIGFuIG9iamVjdCBvZiB0eXBlIGB0dXBsZTxjb25zdCBjaGFyICgmKVs3XSwgY29uc3QgY2hhciAoJilbNl0+YAorKG5vdGUgdGhhdCB0aGUgdHlwZSBvZiBhIHN0cmluZyBsaXRlcmFsIGlzIGFuIGFycmF5IG9mIGNvbnN0IGNoYXJhY3RlcnMsIG5vdAorYGNvbnN0IGNoYXIqYCkuIEhvd2V2ZXIsIHRvIGdldCBgbWFrZV90dXBsZWAgdG8gY3JlYXRlIGEgdHVwbGUgd2l0aCBhbiBlbGVtZW50CitvZiBhIG5vbi1jb25zdCBhcnJheSB0eXBlIG9uZSBtdXN0IHVzZSB0aGUgYHJlZmAgd3JhcHBlci4KKworRnVuY3Rpb24gcG9pbnRlcnMgYXJlIGRlZHVjZWQgdG8gdGhlIHBsYWluIG5vbi1yZWZlcmVuY2UgdHlwZSwgdGhhdCBpcywgdG8KK3BsYWluIGZ1bmN0aW9uIHBvaW50ZXIuIEEgdHVwbGUgY2FuIGFsc28gaG9sZCBhIHJlZmVyZW5jZSB0byBhIGZ1bmN0aW9uLCBidXQKK3N1Y2ggYSB0dXBsZSBjYW5ub3QgYmUgY29uc3RydWN0ZWQgd2l0aCBgbWFrZV90dXBsZWAgKGEgY29uc3QgcXVhbGlmaWVkCitmdW5jdGlvbiB0eXBlIHdvdWxkIHJlc3VsdCwgd2hpY2ggaXMgaWxsZWdhbCk6CisKKyAgICB2b2lkIGYoaW50IGkpOworICAgICAgLi4uCisgICAgbWFrZV90dXBsZSgmZik7IC8vIHR1cGxlPHZvaWQgKCopKGludCk+CisgICAgICAuLi4KKyAgICB0dXBsZTx0dXBsZTx2b2lkICgmKShpbnQpPiA+IGEoZikgLy8gb2sKKyAgICBtYWtlX3R1cGxlKGYpOyAgICAgICAgICAgICAgICAgICAgLy8gbm90IG9rCisKK1tlbmRzZWN0XQorCitbZW5kc2VjdF0KKworW3NlY3Rpb246YWNjZXNzaW5nX2VsZW1lbnRzIEFjY2Vzc2luZyBUdXBsZSBFbGVtZW50c10KKworVHVwbGUgZWxlbWVudHMgYXJlIGFjY2Vzc2VkIHdpdGggdGhlIGV4cHJlc3Npb246CisKKyAgICB0LmdldDxOPigpCisKK29yCisKKyAgICBnZXQ8Tj4odCkKKword2hlcmUgYHRgICBpcyBhIHR1cGxlIG9iamVjdCBhbmQgYE5gIGlzIGEgY29uc3RhbnQgaW50ZWdyYWwgZXhwcmVzc2lvbgorc3BlY2lmeWluZyB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gYmUgYWNjZXNzZWQuIERlcGVuZGluZyBvbiB3aGV0aGVyIGB0YAoraXMgY29uc3Qgb3Igbm90LCBgZ2V0YCByZXR1cm5zIHRoZSBgTmAtdGggZWxlbWVudCBhcyBhIHJlZmVyZW5jZSB0byBjb25zdCBvcgorbm9uLWNvbnN0IHR5cGUuIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBpcyBgMGAgYW5kIHRodXMgYE5gIG11c3QgYmUKK2JldHdlZW4gYDBgIGFuZCAvay9gLTFgLCB3aGVyZSAvay8gaXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdHVwbGUuCitWaW9sYXRpb25zIG9mIHRoZXNlIGNvbnN0cmFpbnRzIGFyZSBkZXRlY3RlZCBhdCBjb21waWxlIHRpbWUuIEV4YW1wbGVzOgorCisgICAgZG91YmxlIGQgPSAyLjc7IEEgYTsKKyAgICB0dXBsZTxpbnQsIGRvdWJsZSYsIGNvbnN0IEEmPiB0KDEsIGQsIGEpOworICAgIGNvbnN0IHR1cGxlPGludCwgZG91YmxlJiwgY29uc3QgQSY+IGN0ID0gdDsKKyAgICAgIC4uLgorICAgIGludCBpID0gZ2V0PDA+KHQpOyBpID0gdC5nZXQ8MD4oKTsgICAgICAgIC8vIG9rCisgICAgaW50IGogPSBnZXQ8MD4oY3QpOyAgICAgICAgICAgICAgICAgICAgICAgLy8gb2sKKyAgICBnZXQ8MD4odCkgPSA1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvaworICAgIGdldDwwPihjdCkgPSA1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yLCBjYW4ndCBhc3NpZ24gdG8gY29uc3QKKyAgICAgIC4uLgorICAgIGRvdWJsZSBlID0gZ2V0PDE+KHQpOyAvLyBvaworICAgIGdldDwxPih0KSA9IDMuMTQ7ICAgICAvLyBvaworICAgIGdldDwyPih0KSA9IEEoKTsgICAgICAvLyBlcnJvciwgY2FuJ3QgYXNzaWduIHRvIGNvbnN0CisgICAgQSBhYSA9IGdldDwzPih0KTsgICAgIC8vIGVycm9yOiBpbmRleCBvdXQgb2YgYm91bmRzCisgICAgICAuLi4KKyAgICArK2dldDwwPih0KTsgIC8vIG9rLCBjYW4gYmUgdXNlZCBhcyBhbnkgdmFyaWFibGUKKworL1tOb3RlOi8gVGhlIG1lbWJlciBgZ2V0YCBmdW5jdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBNUyBWaXN1YWwgQysrCitjb21waWxlci4gRnVydGhlciwgdGhlIGNvbXBpbGVyIGhhcyB0cm91YmxlIHdpdGggZmluZGluZyB0aGUgbm9uLW1lbWJlciBgZ2V0YAorZnVuY3Rpb25zIHdpdGhvdXQgYW4gZXhwbGljaXQgbmFtZXNwYWNlIHF1YWxpZmllci4gSGVuY2UsIGFsbCBgZ2V0YCBjYWxscworc2hvdWxkIGJlIHF1YWxpZmllZCBhcyBgdHVwbGVzOjpnZXQ8Tj4oYV90dXBsZSlgIHdoZW4gd3JpdGluZyBjb2RlIHRoYXQgc2hvdWxkCitjb21waWxlIHdpdGggTVNWQysrIDYuMC4vXS8KKworW2VuZHNlY3RdCisKK1tzZWN0aW9uOmNvbnN0cnVjdGlvbl9hbmRfYXNzaWdubWVudCBDb3B5IENvbnN0cnVjdGlvbiBhbmQgVHVwbGUgQXNzaWdubWVudF0KKworQSB0dXBsZSBjYW4gYmUgY29weSBjb25zdHJ1Y3RlZCBmcm9tIGFub3RoZXIgdHVwbGUsIHByb3ZpZGVkIHRoYXQgdGhlIGVsZW1lbnQKK3R5cGVzIGFyZSBlbGVtZW50LXdpc2UgY29weSBjb25zdHJ1Y3RpYmxlLiBBbmFsb2dvdXNseSwgYSB0dXBsZSBjYW4gYmUKK2Fzc2lnbmVkIHRvIGFub3RoZXIgdHVwbGUsIHByb3ZpZGVkIHRoYXQgdGhlIGVsZW1lbnQgdHlwZXMgYXJlIGVsZW1lbnQtd2lzZQorYXNzaWduYWJsZS4gRm9yIGV4YW1wbGU6CisKKyAgICBjbGFzcyBBIHt9OworICAgIGNsYXNzIEIgOiBwdWJsaWMgQSB7fTsKKyAgICBzdHJ1Y3QgQyB7IEMoKTsgQyhjb25zdCBCJik7IH07CisgICAgc3RydWN0IEQgeyBvcGVyYXRvciBDKCkgY29uc3Q7IH07CisgICAgdHVwbGU8Y2hhciwgQiosIEIsIEQ+IHQ7CisgICAgICAuLi4KKyAgICB0dXBsZTxpbnQsIEEqLCBDLCBDPiBhKHQpOyAvLyBvaworICAgIGEgPSB0OyAgICAgICAgICAgICAgICAgICAgIC8vIG9rCisKK0luIGJvdGggY2FzZXMsIHRoZSBjb252ZXJzaW9ucyBwZXJmb3JtZWQgYXJlOgorCisqIGBjaGFyIC0+IGludGAsCisqIGBCKiAtPiBBKmAgKGRlcml2ZWQgY2xhc3MgcG9pbnRlciB0byBiYXNlIGNsYXNzIHBvaW50ZXIpLAorKiBgQiAtPiBDYCAoYSB1c2VyIGRlZmluZWQgY29udmVyc2lvbiksIGFuZAorKiBgRCAtPiBDYCAoYSB1c2VyIGRlZmluZWQgY29udmVyc2lvbikuCisKK05vdGUgdGhhdCBhc3NpZ25tZW50IGlzIGFsc28gZGVmaW5lZCBmcm9tIGBzdGQ6OnBhaXJgIHR5cGVzOgorCisgICAgdHVwbGU8ZmxvYXQsIGludD4gYSA9IHN0ZDo6bWFrZV9wYWlyKDEsICdhJyk7CisKK1tlbmRzZWN0XQorCitbc2VjdGlvbjpyZWxhdGlvbmFsX29wZXJhdG9ycyBSZWxhdGlvbmFsIE9wZXJhdG9yc10KKworVHVwbGVzIHJlZHVjZSB0aGUgb3BlcmF0b3JzIGA9PWAsIGAhPWAsIGA8YCwgYD5gLCBgPD1gIGFuZCBgPj1gIHRvIHRoZQorY29ycmVzcG9uZGluZyBlbGVtZW50YXJ5IG9wZXJhdG9ycy4gVGhpcyBtZWFucywgdGhhdCBpZiBhbnkgb2YgdGhlc2Ugb3BlcmF0b3JzCitpcyBkZWZpbmVkIGJldHdlZW4gYWxsIGVsZW1lbnRzIG9mIHR3byB0dXBsZXMsIHRoZW4gdGhlIHNhbWUgb3BlcmF0b3IgaXMKK2RlZmluZWQgYmV0d2VlbiB0aGUgdHVwbGVzIGFzIHdlbGwuIFRoZSBlcXVhbGl0eSBvcGVyYXRvcnMgZm9yIHR3byB0dXBsZXMgYGFgCithbmQgYGJgIGFyZSBkZWZpbmVkIGFzOgorCisqIGBhID09IGJgIGlmZiBmb3IgZWFjaCBgaWA6IGBhYCcnJzxzdWJzY3JpcHQ+aTwvc3Vic2NyaXB0PicnJ2AgPT0gYmAnJyc8c3Vic2NyaXB0Pmk8L3N1YnNjcmlwdD4nJycKKyogYGEgIT0gYmAgaWZmIGV4aXN0cyBgaWA6IGBhYCcnJzxzdWJzY3JpcHQ+aTwvc3Vic2NyaXB0PicnJ2AgIT0gYmAnJyc8c3Vic2NyaXB0Pmk8L3N1YnNjcmlwdD4nJycKKworVGhlIG9wZXJhdG9ycyBgPGAsIGA+YCwgYDw9YCBhbmQgYD49YCBpbXBsZW1lbnQgYSBsZXhpY29ncmFwaGljYWwgb3JkZXJpbmcuCisKK05vdGUgdGhhdCBhbiBhdHRlbXB0IHRvIGNvbXBhcmUgdHdvIHR1cGxlcyBvZiBkaWZmZXJlbnQgbGVuZ3RocyByZXN1bHRzIGluIGEKK2NvbXBpbGUgdGltZSBlcnJvci4gQWxzbywgdGhlIGNvbXBhcmlzb24gb3BlcmF0b3JzIGFyZSAvInNob3J0LWNpcmN1aXRlZCIvOgorZWxlbWVudGFyeSBjb21wYXJpc29ucyBzdGFydCBmcm9tIHRoZSBmaXJzdCBlbGVtZW50cyBhbmQgYXJlIHBlcmZvcm1lZCBvbmx5Cit1bnRpbCB0aGUgcmVzdWx0IGlzIGNsZWFyLgorCitFeGFtcGxlczoKKworICAgIHR1cGxlPHN0ZDo6c3RyaW5nLCBpbnQsIEE+IHQxKHN0ZDo6c3RyaW5nKCJzYW1lPyIpLCAyLCBBKCkpOworICAgIHR1cGxlPHN0ZDo6c3RyaW5nLCBsb25nLCBBPiB0MihzdGQ6OnN0cmluZygic2FtZT8iKSwgMiwgQSgpKTsKKyAgICB0dXBsZTxzdGQ6OnN0cmluZywgbG9uZywgQT4gdDMoc3RkOjpzdHJpbmcoImRpZmZlcmVudCIpLCAzLCBBKCkpOworCisgICAgYm9vbCBvcGVyYXRvcj09KEEsIEEpIHsgc3RkOjpjb3V0IDw8ICJBbGwgdGhlIHNhbWUgdG8gbWUuLi4iOyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdDEgPT0gdDI7ICAgICAgICAgICAgICAgLy8gdHJ1ZQorICAgIHQxID09IHQzOyAgICAgICAgICAgICAgIC8vIGZhbHNlLCBkb2VzIG5vdCBwcmludCAiQWxsIHRoZS4uLiIKKworW2VuZHNlY3RdCisKK1tzZWN0aW9uOnRpZXJzIFRpZXJzXQorCisvVGllcnMvIGFyZSB0dXBsZXMsIHdoZXJlIGFsbCBlbGVtZW50cyBhcmUgb2Ygbm9uLWNvbnN0IHJlZmVyZW5jZSB0eXBlcy4gVGhleQorYXJlIGNvbnN0cnVjdGVkIHdpdGggYSBjYWxsIHRvIHRoZSBgdGllYCBmdW5jdGlvbiB0ZW1wbGF0ZSAoY2YuIGBtYWtlX3R1cGxlYCk6CisKKyAgICBpbnQgaTsgY2hhciBjOyBkb3VibGUgZDsKKyAgICAgIC4uLgorICAgIHRpZShpLCBjLCBhKTsKKworVGhlIGFib3ZlIGB0aWVgIGZ1bmN0aW9uIGNyZWF0ZXMgYSB0dXBsZSBvZiB0eXBlIGB0dXBsZTxpbnQmLCBjaGFyJiwgZG91YmxlJj5gLgorVGhlIHNhbWUgcmVzdWx0IGNvdWxkIGJlIGFjaGlldmVkIHdpdGggdGhlIGNhbGwgYG1ha2VfdHVwbGUocmVmKGkpLCByZWYoYyksIHJlZihhKSlgLgorCitBIHR1cGxlIHRoYXQgY29udGFpbnMgbm9uLWNvbnN0IHJlZmVyZW5jZXMgYXMgZWxlbWVudHMgY2FuIGJlIHVzZWQgdG8gJ3VucGFjaycKK2Fub3RoZXIgdHVwbGUgaW50byB2YXJpYWJsZXMuIEUuZy46CisKKyAgICBpbnQgaTsgY2hhciBjOyBkb3VibGUgZDsKKyAgICB0aWUoaSwgYywgZCkgPSBtYWtlX3R1cGxlKDEsJ2EnLCA1LjUpOworICAgIHN0ZDo6Y291dCA8PCBpIDw8ICIgIiA8PCAgYyA8PCAiICIgPDwgZDsKKworVGhpcyBjb2RlIHByaW50cyBgMSBhIDUuNWAgdG8gdGhlIHN0YW5kYXJkIG91dHB1dCBzdHJlYW0uIEEgdHVwbGUgdW5wYWNraW5nCitvcGVyYXRpb24gbGlrZSB0aGlzIGlzIGZvdW5kIGZvciBleGFtcGxlIGluIE1MIGFuZCBQeXRob24uIEl0IGlzIGNvbnZlbmllbnQKK3doZW4gY2FsbGluZyBmdW5jdGlvbnMgd2hpY2ggcmV0dXJuIHR1cGxlcy4KKworVGhlIHR5aW5nIG1lY2hhbmlzbSB3b3JrcyB3aXRoIGBzdGQ6OnBhaXJgIHRlbXBsYXRlcyBhcyB3ZWxsOgorCisgICAgaW50IGk7IGNoYXIgYzsKKyAgICB0aWUoaSwgYykgPSBzdGQ6Om1ha2VfcGFpcigxLCAnYScpOworCitbc2VjdGlvbiBJZ25vcmVdCisKK1RoZXJlIGlzIGFsc28gYW4gb2JqZWN0IGNhbGxlZCBgaWdub3JlYCB3aGljaCBhbGxvd3MgeW91IHRvIGlnbm9yZSBhbiBlbGVtZW50Cithc3NpZ25lZCBieSBhIHR1cGxlLiBUaGUgaWRlYSBpcyB0aGF0IGEgZnVuY3Rpb24gbWF5IHJldHVybiBhIHR1cGxlLCBvbmx5IHBhcnQKK29mIHdoaWNoIHlvdSBhcmUgaW50ZXJlc3RlZCBpbi4gRm9yIGV4YW1wbGUgKG5vdGUsIHRoYXQgaWdub3JlIGlzIHVuZGVyIHRoZQorYHR1cGxlc2Agc3VibmFtZXNwYWNlKToKKworICAgIGNoYXIgYzsKKyAgICB0aWUodHVwbGVzOjppZ25vcmUsIGMpID0gc3RkOjptYWtlX3BhaXIoMSwgJ2EnKTsKKworW2VuZHNlY3RdCisKK1tlbmRzZWN0XQorCitbc2VjdGlvbjpzdHJlYW1pbmcgU3RyZWFtaW5nXQorCitUaGUgZ2xvYmFsIGBvcGVyYXRvcjw8YCBoYXMgYmVlbiBvdmVybG9hZGVkIGZvciBgc3RkOjpvc3RyZWFtYCBzdWNoIHRoYXQKK3R1cGxlcyBhcmUgb3V0cHV0IGJ5IHJlY3Vyc2l2ZWx5IGNhbGxpbmcgYG9wZXJhdG9yPDxgIGZvciBlYWNoIGVsZW1lbnQuCisKK0FuYWxvZ291c2x5LCB0aGUgZ2xvYmFsIGBvcGVyYXRvcj4+YCBoYXMgYmVlbiBvdmVybG9hZGVkIHRvIGV4dHJhY3QgdHVwbGVzCitmcm9tIGBzdGQ6OmlzdHJlYW1gIGJ5IHJlY3Vyc2l2ZWx5IGNhbGxpbmcgYG9wZXJhdG9yPj5gIGZvciBlYWNoIGVsZW1lbnQuCisKK1RoZSBkZWZhdWx0IGRlbGltaXRlciBiZXR3ZWVuIHRoZSBlbGVtZW50cyBpcyBzcGFjZSwgYW5kIHRoZSB0dXBsZSBpcyBlbmNsb3NlZAoraW4gcGFyZW50aGVzaXMuIEZvciBFeGFtcGxlOgorCisgICAgdHVwbGU8ZmxvYXQsIGludCwgc3RkOjpzdHJpbmc+IGEoMS4wZiwgIDIsIHN0ZDo6c3RyaW5nKCJIb3dkeSBmb2xrcyEiKTsKKworICAgIGNvdXQgPDwgYTsKKworb3V0cHV0cyB0aGUgdHVwbGUgYXM6IGAoMS4wIDIgSG93ZHkgZm9sa3MhKWAKKworVGhlIGxpYnJhcnkgZGVmaW5lcyB0aHJlZSBtYW5pcHVsYXRvcnMgZm9yIGNoYW5naW5nIHRoZSBkZWZhdWx0IGJlaGF2aW9yOgorCisqIGBzZXRfb3BlbihjaGFyKWAgZGVmaW5lcyB0aGUgY2hhcmFjdGVyIHRoYXQgaXMgb3V0cHV0IGJlZm9yZSB0aGUgZmlyc3QgZWxlbWVudC4KKyogYHNldF9jbG9zZShjaGFyKWAgZGVmaW5lcyB0aGUgY2hhcmFjdGVyIHRoYXQgaXMgb3V0cHV0IGFmdGVyIHRoZSBsYXN0IGVsZW1lbnQuCisqIGBzZXRfZGVsaW1pdGVyKGNoYXIpYCBkZWZpbmVzIHRoZSBkZWxpbWl0ZXIgY2hhcmFjdGVyIGJldHdlZW4gZWxlbWVudHMuCisKK05vdGUsIHRoYXQgdGhlc2UgbWFuaXB1bGF0b3JzIGFyZSBkZWZpbmVkIGluIHRoZSB0dXBsZXMgc3VibmFtZXNwYWNlLiBGb3IKK2V4YW1wbGU6CisKKyAgICBjb3V0IDw8IHR1cGxlczo6c2V0X29wZW4oJ1snKSA8PCB0dXBsZXM6OnNldF9jbG9zZSgnXScpIDw8IHR1cGxlczo6c2V0X2RlbGltaXRlcignLCcpIDw8IGE7CisKK291dHB1dHMgdGhlIHNhbWUgdHVwbGUgYGFgIGFzOiBgWzEuMCwyLEhvd2R5IGZvbGtzIV1gCisKK1RoZSBzYW1lIG1hbmlwdWxhdG9ycyB3b3JrIHdpdGggYG9wZXJhdG9yPj5gIGFuZCBgaXN0cmVhbWAgYXMgd2VsbC4gU3VwcG9zZQordGhlIGBjaW5gIHN0cmVhbSBjb250YWlucyB0aGUgZm9sbG93aW5nIGRhdGE6CisKKyAgICAoMSAyIDMpIFs0OjVdCisKK1RoZSBjb2RlOgorCisgICAgdHVwbGU8aW50LCBpbnQsIGludD4gaTsKKyAgICB0dXBsZTxpbnQsIGludD4gajsKKworICAgIGNpbiA+PiBpOworICAgIGNpbiA+PiB0dXBsZXM6OnNldF9vcGVuKCdbJykgPj4gdHVwbGVzOjpzZXRfY2xvc2UoJ10nKSA+PiB0dXBsZXM6OnNldF9kZWxpbWl0ZXIoJzonKTsKKyAgICBjaW4gPj4gajsKKworcmVhZHMgdGhlIGRhdGEgaW50byB0aGUgdHVwbGVzIGBpYCBhbmQgYGpgLgorCitOb3RlIHRoYXQgZXh0cmFjdGluZyB0dXBsZXMgd2l0aCBgc3RkOjpzdHJpbmdgIG9yIEMtc3R5bGUgc3RyaW5nIGVsZW1lbnRzIGRvZXMKK25vdCBnZW5lcmFsbHkgd29yaywgc2luY2UgdGhlIHN0cmVhbWVkIHR1cGxlIHJlcHJlc2VudGF0aW9uIG1heSBub3QgYmUKK3VuYW1iaWd1b3VzbHkgcGFyc2VhYmxlLgorCitbZW5kc2VjdF0KKworW3NlY3Rpb246cGVyZm9ybWFuY2UgUGVyZm9ybWFuY2VdCisKK0FsbCB0dXBsZSBhY2Nlc3MgYW5kIGNvbnN0cnVjdGlvbiBmdW5jdGlvbnMgYXJlIHNtYWxsIGlubGluZWQgb25lLWxpbmVycy4KK1RoZXJlZm9yZSwgYSBkZWNlbnQgY29tcGlsZXIgY2FuIGVsaW1pbmF0ZSBhbnkgZXh0cmEgY29zdCBvZiB1c2luZyB0dXBsZXMKK2NvbXBhcmVkIHRvIHVzaW5nIGhhbmQtd3JpdHRlbiB0dXBsZSBsaWtlIGNsYXNzZXMuIFBhcnRpY3VsYXJseSwgd2l0aCBhIGRlY2VudAorY29tcGlsZXIgdGhlcmUgaXMgbm8gcGVyZm9ybWFuY2UgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgY29kZToKKworICAgIGNsYXNzIGhhbmRfbWFkZV90dXBsZSB7CisgICAgICBBIGE7IEIgYjsgQyBjOworICAgIHB1YmxpYzoKKyAgICAgIGhhbmRfbWFkZV90dXBsZShjb25zdCBBJiBhYSwgY29uc3QgQiYgYmIsIGNvbnN0IEMmIGNjKQorICAgICAgICA6IGEoYWEpLCBiKGJiKSwgYyhjYykge307CisgICAgICBBJiBnZXRBKCkgeyByZXR1cm4gYTsgfTsKKyAgICAgIEImIGdldEIoKSB7IHJldHVybiBiOyB9OworICAgICAgQyYgZ2V0QygpIHsgcmV0dXJuIGM7IH07CisgICAgfTsKKworICAgIGhhbmRfbWFkZV90dXBsZSBobXQoQSgpLCBCKCksIEMoKSk7CisgICAgaG10LmdldEEoKTsgaG10LmdldEIoKTsgaG10LmdldEMoKTsKKworYW5kIHRoaXMgY29kZToKKworICAgIHR1cGxlPEEsIEIsIEM+IHQoQSgpLCBCKCksIEMoKSk7CisgICAgdC5nZXQ8MD4oKTsgdC5nZXQ8MT4oKTsgdC5nZXQ8Mj4oKTsKKworTm90ZSwgdGhhdCB0aGVyZSBhcmUgd2lkZWx5IHVzZWQgY29tcGlsZXJzIChlLmcuIGJjYyA1LjUuMSkgd2hpY2ggZmFpbCB0bworb3B0aW1pemUgdGhpcyBraW5kIG9mIHR1cGxlIHVzYWdlLgorCitEZXBlbmRpbmcgb24gdGhlIG9wdGltaXppbmcgYWJpbGl0eSBvZiB0aGUgY29tcGlsZXIsIHRoZSB0aWVyIG1lY2hhbmlzbSBtYXkKK2hhdmUgYSBzbWFsbCBwZXJmb3JtYW5jZSBwZW5hbHR5IGNvbXBhcmVkIHRvIHVzaW5nIG5vbi1jb25zdCByZWZlcmVuY2UKK3BhcmFtZXRlcnMgYXMgYSBtZWNoYW5pc20gZm9yIHJldHVybmluZyBtdWx0aXBsZSB2YWx1ZXMgZnJvbSBhIGZ1bmN0aW9uLiBGb3IKK2V4YW1wbGUsIHN1cHBvc2UgdGhhdCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBgZjFgIGFuZCBgZjJgIGhhdmUgZXF1aXZhbGVudAorZnVuY3Rpb25hbGl0aWVzOgorCisgICAgdm9pZCBmMShpbnQmLCBkb3VibGUmKTsKKyAgICB0dXBsZTxpbnQsIGRvdWJsZT4gZjIoKTsKKworVGhlbiwgdGhlIGNhbGwgIzEgbWF5IGJlIHNsaWdodGx5IGZhc3RlciB0aGFuICMyIGluIHRoZSBjb2RlIGJlbG93OgorCisgICAgaW50IGk7IGRvdWJsZSBkOworICAgICAgLi4uCisgICAgZjEoaSxkKTsgICAgICAgICAvLyAjMQorICAgIHRpZShpLGQpID0gZjIoKTsgLy8gIzIKKworU2VlIFtbbGluayBwdWJsXzEgMV0sIFtsaW5rIHB1YmxfMiAyXV0gZm9yIG1vcmUgaW4tZGVwdGggZGlzY3Vzc2lvbnMgYWJvdXQgCitlZmZpY2llbmN5LgorCitbc2VjdGlvbiBFZmZlY3Qgb24gQ29tcGlsZSBUaW1lXQorCitDb21waWxpbmcgdHVwbGVzIGNhbiBiZSBzbG93IGR1ZSB0byB0aGUgZXhjZXNzaXZlIGFtb3VudCBvZiB0ZW1wbGF0ZQoraW5zdGFudGlhdGlvbnMuIERlcGVuZGluZyBvbiB0aGUgY29tcGlsZXIgYW5kIHRoZSB0dXBsZSBsZW5ndGgsIGl0IG1heSBiZSBtb3JlCit0aGFuIDEwIHRpbWVzIHNsb3dlciB0byBjb21waWxlIGEgdHVwbGUgY29uc3RydWN0LCBjb21wYXJlZCB0byBjb21waWxpbmcgYW4KK2VxdWl2YWxlbnQgZXhwbGljaXRseSB3cml0dGVuIGNsYXNzLCBzdWNoIGFzIHRoZSBgaGFuZF9tYWRlX3R1cGxlYCBjbGFzcyBhYm92ZS4KK0hvd2V2ZXIsIGFzIGEgcmVhbGlzdGljIHByb2dyYW0gaXMgbGlrZWx5IHRvIGNvbnRhaW4gYSBsb3Qgb2YgY29kZSBpbiBhZGRpdGlvbgordG8gdHVwbGUgZGVmaW5pdGlvbnMsIHRoZSBkaWZmZXJlbmNlIGlzIHByb2JhYmx5IHVubm90aWNlYWJsZS4gQ29tcGlsZSB0aW1lCitpbmNyZWFzZXMgYmV0d2VlbiA1IGFuZCAxMCBwZXJjZW50IHdlcmUgbWVhc3VyZWQgZm9yIHByb2dyYW1zIHdoaWNoIHVzZWQgdHVwbGVzCit2ZXJ5IGZyZXF1ZW50bHkuIFdpdGggdGhlIHNhbWUgdGVzdCBwcm9ncmFtcywgbWVtb3J5IGNvbnN1bXB0aW9uIG9mIGNvbXBpbGluZworaW5jcmVhc2VkIGJldHdlZW4gMjIlIHRvIDI3JS4gU2VlIFtbbGluayBwdWJsXzEgMV0sIFtsaW5rIHB1YmxfMiAyXV0gZm9yCitkZXRhaWxzLgorCitbZW5kc2VjdF0KKworW2VuZHNlY3RdCisKK1tzZWN0aW9uOnBvcnRhYmlsaXR5IFBvcnRhYmlsaXR5XQorCitUaGUgbGlicmFyeSBjb2RlIGlzKD8pIHN0YW5kYXJkIEMrKyBhbmQgdGh1cyB0aGUgbGlicmFyeSB3b3JrcyB3aXRoIGEgc3RhbmRhcmQKK2NvbmZvcm1pbmcgY29tcGlsZXIuIEJlbG93IGlzIGEgbGlzdCBvZiBjb21waWxlcnMgYW5kIGtub3duIHByb2JsZW1zIHdpdGggZWFjaAorY29tcGlsZXI6CisKK1t0YWJsZQorICAgIFtbQ29tcGlsZXJdICAgICAgICBbUHJvYmxlbXNdXQorICAgIFtbZ2NjIDIuOTVdICAgICAgICBbLV1dCisgICAgW1tlZGcgMi40NF0gICAgICAgIFstXV0KKyAgICBbW0JvcmxhbmQgNS41XSAgICAgW0Nhbid0IHVzZSBmdW5jdGlvbiBwb2ludGVycyBvciBtZW1iZXIgcG9pbnRlcnMgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgdHVwbGUgZWxlbWVudHNdXQorICAgIFtbTWV0cm93ZXJrcyA2LjJdICBbQ2FuJ3QgdXNlIGByZWZgIGFuZCBgY3JlZmAgd3JhcHBlcnNdXQorICAgIFtbTVMgVmlzdWFsIEMrK10gICBbTm8gcmVmZXJlbmNlIGVsZW1lbnRzIChgdGllYCBzdGlsbCB3b3JrcykuIENhbid0IHVzZQorICAgICAgICAgICAgICAgICAgICAgICBgcmVmYCBhbmQgYGNyZWZgIHdyYXBwZXJzXV0KK10KKworW2VuZHNlY3RdCisKK1tzZWN0aW9uOm1vcmVfZGV0YWlscyBNb3JlIERldGFpbHNdCisKK1tsaW5rIHR1cGxlX2FkdmFuY2VkX2ludGVyZmFjZSBBZHZhbmNlZCBmZWF0dXJlc10gKGRlc2NyaWJlcyBzb21lIG1ldGFmdW5jdGlvbnMgZXRjLikuCisKK1tsaW5rIGRlc2lnbl9kZWNpc2lvbnNfcmF0aW9uYWxlIFJhdGlvbmFsZSBiZWhpbmQgc29tZSBkZXNpZ24vaW1wbGVtZW50YXRpb24gZGVjaXNpb25zXS4KKworW2VuZHNlY3RdCisKK1tzZWN0aW9uOnRoYW5rcyBBY2tub3dsZWRnZW1lbnRzXQorCitHYXJ5IFBvd2VsbCBoYXMgYmVlbiBhbiBpbmRpc3BlbnNhYmxlIGhlbHBpbmcgaGFuZC4gSW4gcGFydGljdWxhciwgc3RyZWFtCittYW5pcHVsYXRvcnMgZm9yIHR1cGxlcyB3ZXJlIGhpcyBpZGVhLiBEb3VnIEdyZWdvciBjYW1lIHVwIHdpdGggYSB3b3JraW5nCit2ZXJzaW9uIGZvciBNU1ZDLCBEYXZpZCBBYnJhaGFtcyBmb3VuZCBhIHdheSB0byBnZXQgcmlkIG9mIG1vc3Qgb2YgdGhlCityZXN0cmljdGlvbnMgZm9yIGNvbXBpbGVycyBub3Qgc3VwcG9ydGluZyBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uLiBUaGFua3MgdG8KK0plcmVteSBTaWVrLCBXaWxsaWFtIEtlbXBmIGFuZCBKZW5zIE1hdXJlciBmb3IgdGhlaXIgaGVscCBhbmQgc3VnZ2VzdGlvbnMuIFRoZQorY29tbWVudHMgYnkgVmVzYSBLYXJ2b25lbiwgSm9obiBNYXggU2thbGxlciwgRWQgQnJleSwgQmVtYW4gRGF3ZXMsIERhdmlkCitBYnJhaGFtcyBhbmQgSGFydG11dCBLYWlzZXIgaGVscGVkIHRvIGltcHJvdmUgdGhlIGxpYnJhcnkuIFRoZSBpZGVhIGZvciB0aGUKK2B0aWVgIG1lY2hhbmlzbSBjYW1lIGZyb20gYW4gb2xkIHVzZW5ldCBhcnRpY2xlIGJ5IElhbiBNY0N1bGxvY2gsIHdoZXJlIGhlCitwcm9wb3NlZCBzb21ldGhpbmcgc2ltaWxhciBmb3IgYHN0ZDo6cGFpcmBzLgorCitbZW5kc2VjdF0KKworW3NlY3Rpb246cmVmZXJlbmNlcyBSZWZlcmVuY2VzXQorCitbI3B1YmxfMV0KK1sxXSBKXHUwMEU0cnZpIEouOiAvVHVwbGVzIGFuZCBtdWx0aXBsZSByZXR1cm4gdmFsdWVzIGluIEMrKy8sIFRVQ1MgVGVjaG5pY2FsIFJlcG9ydCBObyAyNDksIDE5OTkuCisKK1sjcHVibF8yXQorWzJdIEpcdTAwRTRydmkgSi46IC9NTC1TdHlsZSBUdXBsZSBBc3NpZ25tZW50IGluIFN0YW5kYXJkIEMrKyAtIEV4dGVuZGluZyB0aGUgTXVsdGlwbGUgUmV0dXJuIFZhbHVlIEZvcm1hbGlzbS8sIFRVQ1MgVGVjaG5pY2FsIFJlcG9ydCBObyAyNjcsIDE5OTkuCisKK1sjcHVibF8zXQorWzNdIEpcdTAwRTRydmkgSi46IC9UdXBsZSBUeXBlcyBhbmQgTXVsdGlwbGUgUmV0dXJuIFZhbHVlcy8sIEMvQysrIFVzZXJzIEpvdXJuYWwsIEF1Z3VzdCAyMDAxLgorCitbZW5kc2VjdF0K